package cn.ahaoweb.drule.core;

import cn.ahaoweb.drule.core.callback.AfterCreateSessionCallback;
import cn.ahaoweb.drule.core.configuration.Configuration;
import cn.ahaoweb.drule.core.constant.RuleType;
import org.kie.api.KieBase;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * @Name: 规则服务接口
 * @Description: 用于配置和构建 RuleSession
 * @Author: wangzhonghao
 * @Date: 2025/2/12 15:32
 */
public interface RuleService {

    /**
     * 获取唯一标识符
     * @return
     */
    String getIdentifier();

    /**
     * 获取版本号
     * @return
     */
    String getVersion();

    /**
     * 添加规则内容
     * <pre>
     *     添加的内容，需要重新初始化 {@link RuleServiceImpl#init()} 才会生效
     * </pre>
     * @param type 规则类型
     * @param content 内容
     * @return
     */
    RuleService addContent(RuleType type, String content);

    /**
     * 获取所有规则文件
     *
     * @return 一个Map集合，键为规则类型（RuleType），值为对应规则文件的字符串列表（List<String>）
     */
    Map<RuleType, List<String>> getRuleFiles();

    /**
     * 初始化规则服务
     * <pre>
     *     在配置完RuleService的所有配置之后，请务必调用该方法。
     *     该方法会构造知识库kieBase，是后续执行流程必备的元素。
     * </pre>
     * @return
     */
    RuleService init();

    /**
     * 构建规则会话
     * @return
     */
    RuleSession createSession();

    /**
     * 规则会话创建后回调函数
     * @return
     */
    RuleService afterCreateSessionCallback(AfterCreateSessionCallback callback);

    /**
     * 获取配置信息
     * @return
     */
    Configuration getConfig();

    /**
     * 添加属性配置
     * @param name
     * @param value
     * @return
     */
    RuleService addConfig(String name, String value);

    /**
     * 事实对象类型选择器
     * @param selector
     * @return
     */
    RuleService factClassSelector(FactClassSelector selector);

    /**
     * 获取配置信息
     * @return
     */
    KieBase getKieBase();

    /**
     * 获取签名信息
     * @return
     */
    String signature();

    /**
     * 获取事实对象类型选择器
     * @return
     */
    default FactClassSelector getFactClassSelector(){
        return null;
    }

}
